package com.zzvcom.office.cfg;

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.zzvcom.office.entities.OfficeFile;
import com.zzvcom.office.entities.OfficePdf;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.caffeine.CaffeineCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.TimeUnit;

@Configuration
@EnableCaching
public class CacheConfig {

    /**
     * 转换编辑队列，避免重复调用
     * @return
     */
    @Bean(name="urlConvertEditCache")
    public Cache<String, OfficeFile> urlConvertEditCache() {
        Cache<String, OfficeFile> cache = Caffeine.newBuilder()
                // 初始容量
                .initialCapacity(100)
                // 最大缓存数量
                .maximumSize(5000)
                // 缓存写入缓存后，多久不访问移除
                .expireAfterAccess(5, TimeUnit.MINUTES)
                // 开启统计功能
                .recordStats()
                .build();
        return cache;
    }

    /**
     * 文件转pdf，缓存，为了编码重复请求
     * 比如一个url正在进行pdf的转码的过程，下一个请求也请求到，直接转到一个重试页面，让其重试。
     * @return
     */
    @Bean(name="urlCovertPdfCache")
    public Cache<String, OfficePdf> urlCovertPdfCache() {
        Cache<String, OfficePdf> cache = Caffeine.newBuilder()
                // 初始容量
                .initialCapacity(100)
                // 最大缓存数量
                .maximumSize(5000)
                // 缓存写入缓存后，多久不访问移除
                .expireAfterAccess(5, TimeUnit.MINUTES)
                // 开启统计功能
                .recordStats()
                .build();
        return cache;
    }

    /**
     * 转换编辑队列，避免重复调用
     * @return
     */
    @Bean(name="fileIdOfficeFileCache")
    public Cache<String, OfficeFile> fileIdOfficeFileCache() {
        Cache<String, OfficeFile> cache = Caffeine.newBuilder()
                // 初始容量
                .initialCapacity(10)
                // 最大缓存数量
                .maximumSize(500)
                // 缓存写入缓存后，多久不访问移除
                .expireAfterWrite(5, TimeUnit.MINUTES)
                // 开启统计功能
                .recordStats()
                .build();
        return cache;
    }

    @Bean(name = "officeFileCacheManager")
    public CacheManager officeFileCacheManager() {
        CaffeineCacheManager manager = new CaffeineCacheManager();
        manager.setCaffeine(Caffeine.newBuilder()
                .expireAfterWrite(10, TimeUnit.MINUTES)
                .maximumSize(500)
                .recordStats());
        return manager;
    }

}
